package service.edu.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import service.edu.entity.Subject;
import service.edu.entity.excel.SubjectData;
import service.edu.service.SubjectService;

public class SubjectExcelListener extends AnalysisEventListener<SubjectData> {
    //因为SubjectExcelListener不能交给spring进行管理,需要自己new,不能注入其他对象,所以不能实现数据库操作
    //因此需要手动设置构造方法
    //实测@component+@autowired注入subjectService失败了
    public SubjectService subjectService;
    public SubjectExcelListener(SubjectService subjectService) {this.subjectService=subjectService;}
    public SubjectExcelListener() {}

    //判断一级分类科目是否重复，不重复则返回
    private Subject existFirstSubject(SubjectService subjectService,String subjectName){
        QueryWrapper<Subject> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("title", subjectName);
        queryWrapper.eq("parent_id", "0");
        return subjectService.getOne(queryWrapper);
    }
    //判断二级分类科目是否重复，不重复则返回
    private Subject existSecondSubject(SubjectService subjectService,String subjectName,String pid){
        QueryWrapper<Subject> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("title", subjectName);
        queryWrapper.eq("parent_id", pid);
        return subjectService.getOne(queryWrapper);
    }

    //数据一行一行的读写,需要先进行判断是否有重复数据存在,即级别与名称都相同
    @Override
    public void invoke(SubjectData subjectData, AnalysisContext analysisContext) {
        if(subjectData == null) {
            throw new NullPointerException();
        }
        //一行一行读取，每次读取有两个值，第一个值一级分类，第二个值二级分类
        //判断一级分类是否重复
        Subject firstSubject = this.existFirstSubject(subjectService,subjectData.getFirstSubjectName());
        if (firstSubject==null){//如果为空，则没有相同名称的一级分类，可以添加
            //将excel中的数据设置为一级科目的属性,时间属性可以自动注入
            firstSubject=new Subject();
            firstSubject.setParentId("0");
            firstSubject.setTitle(subjectData.getFirstSubjectName());
            //添加到数据库中
            subjectService.save(firstSubject);//添加到数据库时其会自动生成一个id，也是二级分类的父id
        }
        //判断二级分类是否重复
        String id = firstSubject.getId();//二级科目的父id
        Subject secondSubject = this.existSecondSubject(subjectService,subjectData.getSecondSubjectName(), id);
        if (secondSubject==null){//如果为空，则没有相同名称的二级分类，可以添加
            //将excel中的数据设置为二级科目的属性,时间属性可以自动注入
            secondSubject=new Subject();
            secondSubject.setParentId(id);
            secondSubject.setTitle(subjectData.getSecondSubjectName());
            //添加到数据库中
            subjectService.save(secondSubject);
        }
    }
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        System.out.println("读取Excel数据完毕...");
    }
}
